3
תגובות
דרך יעילה יותר
פתח
iiddaannyy
,
שלום לכולם,
אני מנסה לעשות משהו כזה:
יש לי במשנה ids כל מיני idים של משתמשים שונים, ולכל המשתמשים האלה אני צריך לשלוף את מספר הפוסטים שלהם בפורום.
עכשיו יש שתי טבלאות, אחת של תגובות לנושאים ושנייה לנושאים עצמם.
לכן מה שצריך לעשות, זה עבור כל משתמש לספור כמה תגובות הוא הגיב וכמה נושאים הוא פתח.
ניסיתי כל מיני דרכים שהוציאו תוצאות שגויות, ולבסוף עשיתי את זה:
זה נראה ממש רע, שאילתה בתוך שאילתה בתוך שאילתה.
יש למישהו רעיון לדרך טובה יותר?
אני מנסה לעשות משהו כזה:
יש לי במשנה ids כל מיני idים של משתמשים שונים, ולכל המשתמשים האלה אני צריך לשלוף את מספר הפוסטים שלהם בפורום.
עכשיו יש שתי טבלאות, אחת של תגובות לנושאים ושנייה לנושאים עצמם.
לכן מה שצריך לעשות, זה עבור כל משתמש לספור כמה תגובות הוא הגיב וכמה נושאים הוא פתח.
ניסיתי כל מיני דרכים שהוציאו תוצאות שגויות, ולבסוף עשיתי את זה:
SELECT U.`id`, (SELECT COUNT(*) FROM (SELECT `author` FROM `forumsPosts` UNION ALL SELECT `author` FROM `forumsTopics`) AS `table` WHERE `author`=U.`id`) AS `posts` FROM `users` U WHERE U.`id` IN($ids)
זה נראה ממש רע, שאילתה בתוך שאילתה בתוך שאילתה.
יש למישהו רעיון לדרך טובה יותר?
3 תשובות
בעיקרון יש שני דרכים - לעשות את זה בשני שאילתות נפרדות (או תתי שאילתות)
או כמו שאני למשל עושה פה עם מודול שאלות-תשובות - להוסיף טריגר, שכל פעם שעונים משהו לשאלה, להוסיף לעמודה "תשובות" בטבלת "שאלות" + 1 .
וכשמוחקים תשובה לשאלה מסוימת, אז -1.
אם יש לך בעיית ביצועים, אז זה הדרך העדיפה. אם אין לך בעיית ביצועים, אפשר להשאיר את זה עם שאילתה כזאת.
select u.id, count(fp.id) as 'forumposts', count(ft.id) as 'forumtopics'
from users u
left join forumposts fp on fp.author = u.id
left join forumtopics ft on ft.author = u.id
from users u
left join forumposts fp on fp.author = u.id
left join forumtopics ft on ft.author = u.id
ענה
iiddaannyy
ב
18 לאפריל 2012
#
חח יש לי "מחלת ביצועים". אני אוהב להקפיד שדברים כאלה יעשו בצורה טובה ככל שניתן.
אני באמת אלך על עמודה שתספור את הפוסטים, עדיף.
כי כמות המחיקות/יצירות הפוסטים קטנה מכמות הצפיות בפוסטים, ועדיף שאילתה שתעשה -/+1 שתרוץ בתדירות נמוכה יחסית מאשר שאילתה "כבדה" שתרוץ בתדירות גבוהה יותר.
תודה. (: